home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs53.d81 / 28may87s.pma / CXINTR.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  19KB  |  1,003 lines

  1.  
  2.  
  3.  
  4.     title    'Interrupt handler    29 Apr 86'
  5.  
  6.  
  7.     maclib    z80
  8.  
  9.     maclib    cxequ
  10.  
  11.     public    ?sysint
  12.  
  13.  
  14. done$scan:    equ    11110111b
  15.  
  16. clear$TxD$bit:    equ    10010111b    ; 2nd byte of   res  2,a
  17. set$TxD$bit:    equ    11010111b    ; 2nd byte of   setb 2,a
  18.  
  19. buf$end    equ    low(RxD$buffer+RxD$buf$size)
  20.  
  21.     page
  22. ;
  23. ;    The DE register is not changed by the interrupt handler
  24. ;
  25. ;        maximun of     T states advaliable per interrupt
  26. ;        DMA uses about 10 % (or   ) leaving only 
  27. ;        interrupt vectoring use a few more.
  28. ;
  29. ;        if both recv$state and send$state are in idle
  30. ;    T states   209+82++ (191max,38min) = (482max,329min)
  31. ;
  32. ;
  33. ;        if ether recv$state and send$state are active
  34. ;    T states   209+++ (289max, 82min) = (498max,291min)
  35. ;
  36.     CSEG
  37. ?sysint:
  38.     push    psw            ;11
  39.     push    b            ;11
  40.     push    h            ;11
  41. ;
  42.     lxi    b,CIA$1+int$ctrl    ;10
  43.     inp    a            ;12  clear CIA$1 interrupts
  44. ;
  45.    if    not use$6551
  46.     lxi    b,CIA2+data$a        ;10
  47.     inp    a            ;12
  48. out$rs232$cia    equ    $+1
  49.     setb    2,a            ;8   this instruction gets modified
  50.     outp    a            ;12
  51.  
  52.     inr    c            ;4   point to data$b (C=1)
  53.     inp    a            ;12
  54.     mov    h,c            ;4   set H=1
  55. recv$state:
  56.     call    recv$idle        ;17+(153max,54min)
  57.  
  58. send$state:
  59.     call    send$idle        ;17+(136max,28min)
  60.  
  61.     dcr    h            ;4     did H=1 ?
  62.     lxi    h,current$key$delay    ;10
  63.     jnz    skip$keyboard        ;10
  64.  
  65.     page
  66. ;
  67. ;    T states  32    if not done
  68. ;    T states  56+    if key scan done
  69. ;
  70. vector$key$state:
  71.     dcr    m            ;11
  72.     jrnz    exit$int        ;7/12
  73.     lda    int$rate        ;13
  74.     mov    m,a            ;7
  75.    endif
  76. key$state:
  77.     call    key$scan$state        ;17+(191max,38min)
  78.    if    not use$6551
  79.     db    21h            ; lxi h,(mvi m,1)
  80. skip$keyboard:
  81.     mvi    m,1            ;
  82.    endif
  83. exit$int:
  84.     pop    h
  85.     pop    b
  86.     pop    psw
  87.     ei
  88.     ret
  89.  
  90.    if    not use$6551
  91. RxD$count:
  92.     db    0        ; number of bits left to receive
  93. TxD$count:
  94.     db    0        ; number of bits left to transmit
  95.  
  96. current$key$delay:
  97.     db    1
  98.  
  99.     page
  100. ;
  101. ;    T states  52    start bit
  102. ;    T states      no start bit, que inactive 
  103. ;    T states      no start bit, que active, DAV set
  104. ;    T states     no start bit, que active, DAV cleared
  105. ;
  106. recv$idle:
  107.     rar                ;4
  108.     jrnc    set$test$start$bit    ;7/(12+36)
  109.  
  110. ;11+12+31=54
  111. ;
  112. RxD$unque:            ;(36)+12+(105) = 153 max
  113.     jr    test$que        ;12
  114.  
  115. ;
  116. ;    T states  31    no process required
  117. ;    T states  91    que count adjusted (not empty)
  118. ;    t states 105    que count adjusted (empty)
  119. ;
  120. test$que:
  121.     lda    RS232$status        ;13    no processing req if QUE
  122.     ani    00100000b        ;7    bit (5) is clear
  123.     rz                ;5/11
  124.  
  125.     mvi    a,que$to$data-test$que    ;7
  126.     sta    RxD$unque+1        ;13    set next sub state
  127.  
  128.     lxi    h,RxD$buf$get        ;10
  129.     inr    m            ;11
  130.     mov    a,m            ;7
  131.     cpi    buf$end            ;7
  132.     rnz                ;5/11
  133.     mvi    m,low(RxD$buffer)    ;10
  134.     ret                ;10
  135.  
  136. ;
  137. set$test$start$bit:
  138.     lxi    h,test$start$bit    ;10
  139.     shld    recv$state+1        ;16
  140.     ret                ;10
  141.  
  142.     page
  143. ;
  144. ;    T states  28    if DAV still set
  145. ;    T states  89    to move char from que to recv$data
  146. ;
  147. que$to$data:
  148.     lda    RS232$status        ;13
  149.     rrc                ;4
  150.     rc                ;5/11
  151.  
  152.     lxi    h,RxD$buf$get        ;10
  153.     mov    l,m            ;7
  154.     mov    a,m            ;7
  155.     sta    recv$data        ;13
  156.  
  157.     mvi    a,adjust$cnt-test$que    ;7
  158.     sta    RxD$unque+1        ;13    set next sub state
  159.     ret                ;10
  160.  
  161. ;
  162. ;    T states  82    count not zero
  163. ;    T states  99    count becomes zero 
  164. ;
  165. adjust$cnt:
  166.     xra    a            ;4
  167.     lxi    h,RxD$buf$count        ;10
  168.     dcr    m            ;11
  169.     mvi    l,low(RS232$status)    ;7
  170.     setb    0,m            ;15    set DAV flag
  171.     jrnz    adj$cont        ;7/12
  172.     res    5,m            ;15    que empty turn QUE bit(5) off
  173.     mvi    a,que$empty-test$que    ;7
  174. adj$cont:
  175.     sta    RxD$unque+1        ;13
  176.     ret                ;10
  177. ;
  178. ;    T states  52/94
  179. ;
  180. que$empty:
  181.     xra    a            ;4    offset of zero for JR
  182.     sta    RxD$unque+1        ;13    (to get to test$que)
  183.     lxi    h,xon$xoff$flag        ;10
  184.     mvi    a,XON            ;7
  185.     cmp    m            ;7
  186.     rz                ;5/11
  187.     mov    m,a            ;7
  188.     mvi    a,send$x-send$norm    ;7
  189.     sta    send$idle+1        ;13
  190.     ret                ;10
  191.  
  192.  
  193.     page
  194. ;
  195. ;    test for false start
  196. ;
  197. ;    T states  72    if valid start
  198. ;    T states  52    if false start
  199. ;
  200. test$start$bit:
  201.     rar                ;4
  202.     jrc    set$recv$idle        ;7/(12+36)    RxD in carry bit
  203.     lxi    h,RS232$status        ;10
  204.     setb    1,m            ;15    set receiving data flag
  205.     lxi    h,start$idle$1        ;10
  206.     shld    recv$state+1        ;16
  207.     ret                ;10
  208.  
  209. ;
  210. ;    T states  36
  211. ;
  212. set$recv$idle:
  213.     lxi    h,recv$idle        ;10
  214.     shld    recv$state+1        ;16
  215.     ret                ;10
  216.  
  217.  
  218. ;
  219. ;    T states  93
  220. ;
  221. start$idle$1:
  222.     xra    a            ;4
  223.     sta    recv$bit+2        ;13
  224.     lda    XxD$config        ;13
  225.     ani    1            ;7
  226.     adi    7            ;7
  227.     sta    RxD$count        ;13
  228.     lxi    h,que$full$test        ;10
  229.     shld    recv$state+1        ;16
  230.     ret                ;10
  231.  
  232.     page
  233. ;
  234. ;    T states  57    RxD buffer not full
  235. ;    T states 117    RxD buffer full (send XOFF)
  236. ;    T states  86    RxD buffer full (XOFF sent already)
  237. ;
  238. que$full$test:
  239.     lxi    h,recv$bit        ;10
  240.     shld    recv$state+1        ;16
  241.     lda    RxD$buf$count        ;13
  242.     cpi    RxD$buf$size-16        ;7
  243.     rc                ;5/11
  244.     lxi    h,xon$xoff$flag        ;10
  245.     mvi    a,XOFF            ;7
  246.     cmp    m            ;7
  247.     rz                ;5/11
  248.     mov    m,a            ;7    set mode to send Xoff
  249.     mvi    a,send$x-send$norm    ;7
  250.     sta    send$idle+1        ;13
  251.     ret                ;10
  252.  
  253. ;
  254. ;    T states  64
  255. ;
  256. recv$bit:
  257.     rar                ;4
  258.     mvi    a,00            ;7    RxD in carry bit
  259.     rar                ;4    move data bit into MSB
  260.     sta    recv$bit+2        ;13
  261.     lxi    h,recv$bit$done$test    ;10
  262.     shld    recv$state+1        ;16
  263.     ret                ;10
  264.  
  265. ;
  266. ;    T states   69    if bits still remaining
  267. ;    T states  
  268. ;
  269. recv$bit$done$test:
  270.     lxi    h,RxD$count        ;10
  271.     dcr    m            ;11
  272.     jrnz    enter$recv$bit$idle    ;7/(12+36)
  273.  
  274.     lda    XxD$config        ;13
  275.     rlc                ;4
  276.     lxi    h,enter$RxD$stop    ;10
  277.     jrnc    do$test$stop        ;7/12
  278.     lxi    h,enter$RxD$parity    ;10
  279. do$test$stop:
  280.     shld    recv$state+1        ;16
  281.  
  282.     ani    1*2            ;7    A=0 if 7 bits else 8 bits
  283.     lda    recv$bit+2        ;13
  284.     jrnz    done$adj        ;7/12
  285.     rrc                ;4
  286. done$adj:
  287.     sta    RxD$data        ;13
  288.     ret                ;10
  289.  
  290. ;
  291. ;    T states  36
  292. ;
  293. enter$recv$bit$idle:
  294.     lxi    h,recv$bit$idle        ;10
  295.     shld    recv$state+1        ;16
  296.     ret                ;10
  297.  
  298. ;
  299. ;    T states  36+(28/105)
  300. ;
  301. recv$bit$idle:
  302.     lxi    h,recv$bit        ;10
  303.     shld    recv$state+1        ;16
  304.     jmp    RxD$unque        ;10
  305.     
  306.     page
  307. ;
  308. ;    T states  36+(28/105)
  309. ;
  310. enter$RxD$parity:
  311.     lxi    h,test$RxD$parity    ;10
  312.     shld    recv$state+1        ;16
  313.     jmp    RxD$unque        ;10
  314.  
  315. ;
  316. ;    T states      bit hi
  317. ;    T states      bit low
  318. ;
  319. test$RxD$parity:
  320.     lxi    h,RxD$parity$idle    ;10        RxD data bit in carry
  321.     shld    recv$state+1        ;16
  322.     rar                ;4
  323.     lda    XxD$config        ;13
  324.     jrc    RxD$parity$hi        ;7/12
  325.     rlc                ;4
  326.     rlc                ;4        mark space mode ? 
  327.     jrnc    test$parity$space    ;7/(12+15/46)    yes, go test it
  328.     rlc                ;4        get odd even mode
  329.     jr    test$odd$even        ;12+35/54
  330.  
  331. ;
  332. test$parity$space:        ;15/
  333.     rlc                ;4
  334.     rnc                ;5/11
  335.     jr    parity$error        ;12+25
  336.  
  337. ;
  338. test$parity$mark:        ;15/
  339.     rlc                ;4
  340.     rc                ;5/11
  341.     jr    parity$error        ;12+25
  342.  
  343.     page
  344. ;
  345. RxD$parity$hi:                ;4
  346.     rlc                ;4
  347.     rlc                ;4        mark/space mode ?
  348.     jrnc    test$parity$mark    ;7/12        yes, go test it
  349.     rlc                ;4        get odd/even flag
  350.     cmc                ;4        toggle it
  351. test$odd$even:            ;35/
  352.     lda    recv$bit+2        ;13
  353.     aci    0            ;7    
  354.     ana    a            ;4
  355.     rpe                ;5/11
  356. parity$error:            ;35
  357.     lxi    h,RS232$status        ;10
  358.     setb    4,m            ;15    set parity error
  359.     ret                ;10
  360.  
  361. ;
  362. ;    T states  36
  363. ;
  364. RxD$parity$idle:
  365.     lxi    h,enter$RxD$stop    ;10
  366.     shld    recv$state+1        ;16
  367.     jmp    RxD$unque        ;10
  368.  
  369.     page
  370. ;
  371. ;    T states   90     if que not in use and DAV is cleared
  372. ;    T states 149/151 if data placed in que
  373. ;
  374. enter$RxD$stop:
  375.     lda    RS232$status        ;13
  376.     ani    00100001b        ;7    DAV set or data in que?
  377.     jrnz    place$in$que        ;7/12    yes, place new char in que
  378.     lda    RxD$data        ;13    no, place char in data reg.
  379.     sta    recv$data        ;13
  380.     lxi    h,test$RxD$stop$dav    ;10
  381.     shld    recv$state+1        ;16
  382.     ret                ;10
  383.  
  384. ;
  385. place$in$que:            ;116/118
  386.     lxi    h,RxD$buf$count        ;10
  387.     inr    m            ;11
  388.     inr    l            ;4
  389.     mov    a,m            ;7
  390.     inr    a            ;4
  391.     cpi    buf$end            ;7
  392.     jrnz    put$buf$ok        ;7/12
  393.     mvi    a,low(RxD$buffer)    ;7
  394. put$buf$ok:
  395.     mov    m,a            ;7
  396.     mov    l,a            ;4
  397. RxD$data    equ    $+1
  398.     mvi    a,00            ;7
  399.     mov    m,a            ;7
  400.     lxi    h,test$RxD$stop$que    ;10
  401.     shld    recv$state+1        ;16
  402.     ret
  403.  
  404.     page
  405. ;
  406. ;    T states      no errors
  407. ;    T states      framing error    
  408. ;
  409. test$RxD$stop$que:
  410.     rar                ;4
  411.     mvi    a,00100000b        ;7
  412.     jmp    test$RxD$cont        ;10
  413.  
  414. ;
  415. ;    T states       no errors
  416. ;    T states       framing error    
  417. ;
  418. test$RxD$stop$dav:
  419.     rar                ;4
  420.     mvi    a,00000001b        ;7
  421. test$RxD$cont:
  422.     jrc    good$RxD$stop        ;7/12
  423.     ori    00001000b        ;7    set framing error
  424. good$RxD$stop:
  425.     lxi    h,RS232$status        ;10
  426.     ora    m            ;7
  427.     ani    11111101b        ;7    clear recv active flag bit
  428.     mov    m,a            ;7
  429.     lxi    h,recv$idle        ;10
  430.     shld    recv$state+1        ;16
  431.     ret                ;10
  432.  
  433.     page
  434. ;*
  435. ;*    T states       stay in idle state
  436. ;*    T states      exit idle state (recv buffer not full)
  437. ;*    T states      exit idle state (recv buffer full)
  438. ;*
  439. send$idle:
  440.     jr    send$norm        ;12
  441.  
  442. send$norm:
  443.     lda    RS232$status        ;13
  444.     rlc                ;4
  445.     rnc                ;5/11
  446.  
  447.     lxi    h,start$send$1        ;10
  448.     shld    send$state+1        ;16
  449.     mvi    a,clear$TxD$bit        ;7
  450.     sta    out$rs232$cia        ;13    send the start bit
  451.     ret                ;10
  452.  
  453. ;
  454. ;    T states   12+118
  455. ;
  456. send$x:
  457. xon$xoff$flag    equ    $+1
  458.     mvi    a,XON            ;7    
  459.     sta    send$bits+1        ;13
  460.     xra    a            ;4
  461.     sta    send$idle+1        ;13
  462.     mvi    a,clear$TxD$bit        ;7
  463.     sta    out$rs232$cia        ;13    send the start bit
  464.     lxi    h,RS232$status        ;10
  465.     setb    6,m            ;15    flag send bussy
  466.     lxi    h,start$xon$xoff    ;10
  467.     shld    send$state+1        ;16
  468.     ret                ;10
  469.  
  470.     page
  471.  
  472. ;
  473. ;    T states  107
  474. ;
  475. start$send$1:
  476.     lda    xmit$data        ;13
  477.     sta    send$bits+1        ;13
  478.     lxi    h,RS232$status        ;10
  479.     mov    a,m            ;7
  480.     xri    0C0h            ;7    clear bit 7 and set bit 6
  481.     mov    m,a            ;7
  482. start$xon$xoff:
  483.     lda    XxD$config        ;13
  484.     ani    1            ;7
  485.     adi    7            ;7
  486.     sta    TxD$count        ;13
  487. enter$send$bits:
  488.     lxi    h,start$bit$idle    ;10
  489.     shld    send$state+1        ;16
  490.     ret                ;10
  491.  
  492. ;
  493. ;    T states  36
  494. ;
  495. start$bit$idle:
  496.     lxi    h,send$bits        ;10
  497.     shld    send$state+1        ;16
  498.     ret                ;10
  499.  
  500. ;
  501. ;    T states  94    data bit low
  502. ;    T states  92    data bit hi    
  503. ;
  504. send$bits:
  505.     mvi    a,00            ;7
  506.     rrc                ;4
  507.     sta    send$bits+1        ;13
  508.     lxi    h,count$TxD        ;10
  509.     shld    send$state+1        ;16
  510. send$TxD:            ;42/44
  511.     mvi    a,set$TxD$bit        ;7
  512.     jrc    send$hi$bit        ;7/12
  513.     mvi    a,clear$TxD$bit        ;7
  514. send$hi$bit:
  515.     sta    out$rs232$cia        ;13
  516.     ret                ;10
  517.  
  518. ;
  519. ;    T states      if more data bits to send
  520. ;    T states      if done sending bits
  521. ;
  522. count$TxD:
  523.     lxi    h,TxD$count        ;10
  524.     dcr    m            ;11
  525.     jrnz    enter$send$bits        ;7/12
  526.     lxi    h,TxD$parity$wait    ;10
  527.     shld    send$state+1        ;16
  528.     ret                ;10
  529.  
  530.     page
  531. ;
  532. ;    T states  36
  533. ;
  534. TxD$parity$wait:
  535.     lxi    h,TxD$parity        ;10
  536.     shld    send$state+1        ;16
  537.     ret                ;10
  538.  
  539. ;
  540. ;
  541. ;    T states   85    if no parity
  542. ;    T states  124    if mark parity
  543. ;    T states  126    if space parity
  544. ;    T states  136    if even parity
  545. ;    T states  129    if odd parity
  546. ;
  547. TxD$parity:
  548.     lda    XxD$config        ;13
  549.     rlc                ;4
  550.     jrnc    TxD$stop        ;7/(12+56)
  551.     lxi    h,TxD$parity$idle$1    ;10
  552.     shld    send$state+1        ;16
  553.     rlc                ;4
  554.     jrnc    send$mark$space        ;7/(12+16+42/44)
  555.     rlc                ;4
  556.     lda    send$bits+1        ;13
  557.     aci    0            ;7
  558.     ana    a            ;4
  559.     mvi    a,set$TxD$bit        ;7
  560.     jpo    send$TxD$parity        ;10
  561.     mvi    a,clear$TxD$bit        ;7
  562. send$TxD$parity:
  563.     sta    out$rs232$cia        ;13
  564.     ret                ;10
  565. ;
  566. send$mark$space:
  567.     rlc                ;4
  568.     jr    send$TxD        ;12+42/44
  569.  
  570. ;
  571. ;    T states  36
  572. ;
  573. TxD$parity$idle$1:
  574.     lxi    h,TxD$parity$idle$2        ;10
  575.     shld    send$state+1            ;16
  576.     ret                    ;10
  577.  
  578. ;
  579. ;    T states  36
  580. ;
  581. TxD$parity$idle$2:
  582.     lxi    h,TxD$stop            ;10
  583.     shld    send$state+1            ;16
  584.     ret                    ;10
  585.  
  586.     page
  587. ;
  588. ;    T states   103/101
  589. ;
  590. TxD$stop:
  591.     lxi    h,TxD$stop$idle            ;10
  592.     shld    send$state+1            ;16
  593.  
  594.     mvi    a,set$TxD$bit            ;7
  595.     sta    out$rs232$cia            ;13
  596.  
  597.     lda    XxD$config            ;13
  598.     ani    2                ;7
  599.     jrnz    one$stop$bit            ;7/12
  600.     mvi    a,5                ;7
  601. one$stop$bit:
  602.     inx    h                ;6
  603.     mov    m,a                ;7
  604.     ret                    ;10
  605.  
  606. ;
  607. ;    T states  35/90
  608. ;
  609. TxD$stop$idle:
  610.     mvi    a,00                ;7
  611.     dcr    a                ;4
  612.     sta    TxD$stop$idle+1            ;13
  613.     rnz                    ;5/11
  614.     lxi    h,RS232$status            ;10
  615.     res    6,m                ;15
  616.     lxi    h,send$idle            ;10
  617.     shld    send$state+1            ;16
  618.     ret                    ;10
  619.     
  620.    endif
  621.     page
  622. ;
  623. ;
  624. ;
  625. Key$Scan$State:
  626.     jr    scan$CIA        ;12
  627.  
  628. ;
  629. ;    T states    no new key down
  630. ;    T states    state change
  631. ;    T states      new key down
  632. ;
  633. scan$CIA:
  634.     stc                ;4
  635.     mvi    a,11111110b        ;7    data field updated by code
  636.     lxi    b,key$row        ;10
  637.     outp    a            ;12
  638.     cpi    11111111b        ;7
  639.     jrz    extra$3            ;7/12 carry=0 if A=11111111
  640.     ral                ;4
  641.     sta    scan$CIA+1+1        ;13
  642.     lxi    h,key$scan$tbl        ;10   get current new table pointer
  643.     inr    c            ;4    point to KEY$COL (input)
  644.     jmp    cont$read        ;10
  645. ;
  646. extra$3:
  647.     ral                ;4
  648.     sta    scan$CIA+1+1        ;13
  649.     mvi    a,scan$VIC-scan$CIA    ;7
  650.     sta    Key$Scan$State+1    ;13
  651.     ret                ;10
  652.  
  653.     page
  654. ;
  655. ;    T states      no new key and no state change
  656. ;
  657. scan$VIC:
  658.     mvi    a,11101110b        ;7
  659.     lxi    h,key$scan$tbl        ;10   get current new table pointer
  660.     lxi    b,vic$key$row        ;10
  661.     outp    a            ;12    
  662.     rlc                ;4
  663.     sta    scan$VIC+1        ;13
  664.     jrnc    normal$8        ;7/12
  665.     lxi    b,key$col        ;10
  666. cont$read:
  667.     inp    a            ;12   0FFh if no key down
  668.     inr    m            ;11
  669.     mov    l,m            ;7
  670.     mov    b,m            ;7    get old value in B
  671.     mov    m,a            ;7    save new value
  672.     xra    b            ;4    get differances
  673.     ana    b            ;4    test for only new keys down
  674.     rz                ;5/11
  675.     sta    matrix$byte        ;13
  676.     lxi    h,key$found        ;10
  677.     shld    key$state+1        ;16
  678.     ret                ;10
  679. ;
  680. ;
  681. normal$8:
  682. ;    mvi    a,scan$CIA-scan$CIA    ;7
  683.     xra    a            ;4
  684.     sta    Key$Scan$State+1    ;13
  685.     mov    m,l            ;7    reset current table pointer
  686.     lxi    h,Key$Repeat$State    ;10
  687.     shld    key$state+1        ;16
  688.     ret                ;10
  689.  
  690.     page
  691. ;
  692. ;    T states   48    repeat not active
  693. ;    T states  124    testing repeat (key realeased)
  694. ;    T states  110    testing repeat (not found)
  695. ;    T states  109    testing repeat (found)
  696. ;
  697. Key$Repeat$State:
  698.     lxi    h,flash$wait        ;10
  699.     shld    key$state+1        ;16
  700. repeat$count    equ    $+1
  701.     mvi    a,00            ;7
  702.     ora    a            ;4
  703.     rz                ;5/11
  704.     lxi    h,repeat$count        ;10
  705.     dcr    a            ;4    yes, test for repeat yet
  706.     jrnz    not$repeat$yet        ;7/(12+(42/56))
  707. ;
  708. ;    the following 4 lines of code may NOT be changed.
  709. ;    CONF.COM looks for them to change the repeat rate.
  710. ;    also looks for RET ; MVI A,xx ; STA xxxx (see set$key$parm)
  711. ;
  712.     mvi    m,3            ;10
  713.     lxi    h,save$key        ;10
  714.     shld    key$state+1        ;16
  715.     ret                ;10
  716. ;
  717. not$repeat$yet:            ;42/56
  718.     mov    m,a            ;7
  719. matrix$pos    equ    $+1
  720.     lda    Key$scan$tbl        ;13
  721. repeat$mask    equ    $+1
  722.     mvi    b,00            ;7
  723.     ana    b            ;4    key still down? (A=0)
  724.     rz                ;5/11 yes, exit for now
  725.     mvi    m,0            ;10
  726.     ret                ;10
  727.  
  728.     page
  729. ;
  730. ;    T states  101    flash
  731. ;    T states   72    no flash
  732. ;
  733. flash$wait:
  734.     mvi    a,01            ;7
  735.     dcr    a            ;4
  736.     sta    flash$wait+1        ;13
  737.     jrnz    no$flash        ;7/(13+36)
  738.  
  739.     mvi    a,5            ;7
  740.     sta    flash$wait+1        ;13
  741.     lxi    h,flash            ;10
  742.     shld    key$state+1        ;16    
  743.     ret                ;10
  744.  
  745. ;*
  746. ;*
  747. ;*    T states 135    if cursor off screen
  748. ;*    T states 119    if cursor  on screen
  749. ;*
  750. flash:
  751.     lda    force$map        ;13
  752.     sta    bank$0            ;13
  753.     mov    b,a            ;4
  754. ;
  755. ;    toggle 40 column screen cursor on/off
  756. ;
  757.     lhld    flash$pos        ;16
  758.     xra    a            ;4    clear A
  759.     ora    h            ;4    return if H=0
  760.     jrz    exit$flash        ;7/12
  761.     mov    a,m            ;7
  762.     xri    80h            ;7
  763.     mov    m,a            ;7
  764. exit$flash:
  765.     mov    a,b            ;4
  766.     sta    force$map        ;13
  767. no$flash:
  768.     lxi    h,Key$Scan$State    ;10
  769.     shld    key$state+1        ;16
  770.     ret                ;10
  771.  
  772.     page
  773. ;
  774. ;
  775. ;
  776. key$found:    ;148/138/157/147/166/156/161/167
  777. matrix$byte    equ    $+1
  778.     mvi    b,00            ;7
  779.     mov    a,b            ;4
  780.     ani    11110000b        ;7
  781.     jz    check$low$4        ;10+(138/128/133/139)
  782.     ani    11000000b        ;7
  783.     jrz    check$5$and$4        ;7/(12+(110/100))
  784.     ani    10000000b        ;7
  785.     mvi    c,6            ;7
  786.     jrnz    is$add$1        ;7/(12+70)
  787.     mvi    a,01000000b        ;7
  788.     jr    is$common        ;12+66
  789. ;
  790. check$5$and$4:            ;110/100
  791.     mov    a,b            ;4
  792.     ani    00100000b        ;7
  793.     mvi    c,4            ;7
  794.     jrnz    is$add$1        ;7/(12+70)
  795.     mvi    a,00010000b        ;7
  796.     jr    is$common        ;12+66
  797. ;
  798. ;
  799. check$low$4:        ;138/128/133/139
  800.     mov    a,b            ;4
  801.     ani    00001111b        ;7
  802.     jrz    exit$found        ;7/12
  803.     ani    00001100b        ;7
  804.     jrz    check$1$and$0        ;7/12+(96/102)
  805.     ani    00001000b        ;7
  806.     mvi    c,2            ;7
  807.     jrnz    is$add$1        ;7/(12+70)
  808.     mvi    a,00000100b        ;7
  809.     jr    is$common        ;12+66
  810. ;
  811. check$1$and$0:            ;
  812.     mov    a,b            ;4
  813.     ani    00000010b        ;7
  814.     mvi    c,0            ;7
  815.     jrnz    is$add$1        ;7/(12+70)
  816.     inr    a            ;4    set A=1
  817.     jr    is$common        ;12+66
  818. ;
  819. ;
  820. is$add$1:            ;70
  821.     inr    c            ;4
  822. is$common:            ;66
  823.     sta    mask$value        ;13
  824.     mov    a,c            ;4
  825.     sta    bit$value        ;13
  826.     lxi    h,key$found$2        ;10
  827.     shld    key$state+1        ;16
  828.     ret                ;10
  829. ;
  830. exit$found:
  831.     lxi    h,Key$Scan$state    ;10
  832.     shld    key$state+1        ;16
  833.     ret                ;10
  834.  
  835.     page
  836. ;
  837. ;    T states
  838. ;
  839. key$found$2:
  840.     lxi    h,matrix$byte        ;10
  841. mask$value    equ    $+1
  842.     mvi    a,00            ;7
  843.     xra    m            ;7   clear current bit
  844.     mov    m,a            ;7
  845. bit$value    equ    $+1
  846.     mvi    b,00            ;7
  847.     lxi    h,key$scan$tbl        ;10  get the pointer
  848.     mov    a,m            ;7
  849.     sub    l            ;4   remove the bias
  850.     dcr    a            ;4   then one extra (pointer)
  851.     add    a            ;4
  852.     add    a            ;4
  853.     add    a            ;4   shift left 3 bits
  854.     add    b            ;4   add in bit position
  855.     sta    key$code        ;13  save as the key code
  856.     lxi    h,remove$special$keys    ;10
  857.     shld    key$state+1        ;16
  858.     ret                ;10
  859.  
  860.     page
  861. ;
  862. ;    T states          if not a shift of control key
  863. ;    T states  68/82/96    if cntr / rt_shift / lf_shift
  864. ;
  865. remove$special$keys:
  866.     lxi    h,key$found        ;10
  867.     lda    key$code        ;13
  868.     cpi    38h+2            ;7    control key pressed ?
  869.     jrz    bad$key            ;7/12
  870.     cpi    30h+4            ;7
  871.     jrz    bad$key            ;7/12
  872.     cpi    08h+7            ;7
  873.     jrz    bad$key            ;7/12
  874.  
  875.     lxi    h,set$key$parm        ;10
  876. bad$key:
  877.     shld    key$state+1        ;16
  878.     ret                ;10
  879.  
  880. ;
  881. ;    T states
  882. ;
  883. ;    do not change the next 2 lines. CONF uses them to
  884. ;    the set repeat rate. (also RET above here)
  885. ;
  886. set$key$parm:
  887.     mvi    a,8            ;7
  888.     sta    repeat$count        ;13  number of counts for repeat
  889.     lda    key$scan$tbl        ;13
  890.     sta    matrix$pos        ;13
  891.     lda    mask$value        ;13
  892.     sta    repeat$mask        ;13
  893.     lxi    h,build$cntr$byte    ;10
  894.     shld    key$state+1        ;16
  895.     ret                ;10
  896.  
  897. ;
  898. ;    T states  
  899. ;
  900. build$cntr$byte:
  901.     lda    key$scan$tbl+1+7    ;13  get control byte row
  902.     cma                ;4
  903.     ani    04h            ;7   test control key bit
  904.     jrz    not$control        ;7/12
  905.     mvi    a,7            ;7
  906. not$control:
  907.     mov    b,a            ;4
  908.     lda    key$scan$tbl+1+6    ;13  get rigth shift byte row
  909.     cma                ;4
  910.     ani    10h            ;7   test right key bit
  911.     ora    b            ;4
  912.     mov    b,a            ;4
  913.     lda    key$scan$tbl+1+1    ;13  get left shift byte row
  914.     cma                ;4
  915.     ani    80h            ;7   test left key bit
  916.     ora    b            ;4
  917.     mov    b,a            ;4
  918.     ani    90h            ;7   either shift key down?
  919.     mov    a,b            ;4
  920.     jrz    no$shift        ;7/12 no, jump
  921.     ori    2            ;7    yes, set shift control bit
  922. no$shift:
  923.     sta    ctrl$byte        ;13
  924.     lxi    h,save$key        ;10
  925.     shld    key$state+1        ;16
  926.     ret                ;10
  927.  
  928.     page
  929. ;
  930. ;
  931. ;    NOTE:    character buffer MUST be on one page
  932. ;         (and have even number of bytes)
  933. ;
  934. ; buffer is FULL when data at put pointer does not equal 0ffh
  935. ; insert new character at (put pointer)
  936. ; and character control byte at (put pointer)+1
  937. ;    T states 38 if buffer is full
  938. ;    T states 146/148
  939. ;
  940. save$key:
  941.     lhld    key$put$ptr        ;16   get put pointer
  942.     mov    a,m            ;7    get byte from buffer
  943.     inr    a            ;4    room in buffer? (-1 if so)
  944.     rnz                ;5/11 no, wait for room in buffer
  945. key$code    equ    $+1        
  946.     mvi    m,00            ;10   get matrix position
  947.     inr    l            ;4
  948. ctrl$byte    equ    $+1
  949.     mvi    a,00            ;7
  950.     mov    m,a            ;7
  951.     inr    l            ;4
  952.     mov    a,l            ;4
  953.     cpi    low(key$buffer+key$buf$size)    ;7
  954.     jrnz    put$ptr$ok        ;7/12
  955.     mvi    a,low(key$buffer)    ;7
  956. put$ptr$ok:
  957.     sta    key$put$ptr        ;13  adjust the low byte of the put ptr
  958.     lxi    h,Key$tick        ;10
  959.     shld    key$state+1        ;16
  960.     ret                ;10
  961. ;
  962. ;    T states
  963. ;
  964. key$tick:
  965.     lxi    b,sid+24        ;10
  966.     lda    tick$vol        ;13
  967.     outp    a            ;12
  968.     mvi    c,low(sid+11)        ;7
  969.     mvi    a,80h            ;7
  970.     outp    a            ;12
  971.     inr    a            ;4
  972.     outp    a            ;12
  973.     lxi    h,key$scan$state    ;10
  974.     shld    key$state+1        ;16
  975.     ret                ;10
  976.  
  977.     page
  978.  
  979. ;
  980. ;_____      _____ _____ _____ _____ _____ _____ _____ _____ _____ __________
  981. ;    |     |     |     |     |     |     |     |     |     |     |    |    |
  982. ;    |  S  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  P  |   stop  |
  983. ;    |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|    |    |_
  984. ;
  985. ;
  986. ;  Reciever State Machine
  987. ;
  988. ;
  989. ;_____      _____ _____ _____ _____ _____ _____ _____ _____ _____ __________
  990. ;    |     |     |     |     |     |     |     |     |     |     |    |    |
  991. ;    |  S  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  P  |   stop  |
  992. ;    |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|    |    |_
  993. ;
  994. ;
  995. ;  Transmitter State Machine (TSM)
  996. ;
  997. ;
  998.  
  999. ;
  1000. ;  Keyboard Scan State Machine (KSSM)
  1001. ;
  1002.